#ifndef PREF_H
#define PREF_H

#include "pkeyitem.h"
#include "pkeylist.h"

#include <map>
using namespace std;

#include <QtGui> // SERIALIZZAZIONE

class PRef :
    virtual public PReport
{
public:

    PRef();                           // costruttore di default
    PRef(const PKeyList *plist);      // costruttore con la lista dei riferimenti
    PRef(const PRef& ref);            // costruttore per copia
    PRef& operator=(const PRef& ref); // operatore di assegnamento

    // Restituisce il riferimento FROM alla tabella ref_tab se lo trova unico
    // altrimenti restituisce un errore err.
    virtual const PKeyItem& getRefFrom( const int& ref_tab, int& err ) const;
    virtual const PKeyItem& getRefFrom( const int& ref_tab ) const;

    // Controlla che esista la chiave key nel vettore delle chiavi
    bool hasRefFrom( const PKeyItem &key_item ) const;

    // Setta il riferimento FROM ma non aggiunge bil segnaposto.
    virtual void setRefFrom( const PKeyItem& ref_from, int& err);
    virtual void setRefFrom( const PKeyItem& ref_from );

    // Resetta il riferimento FROM ma non elimina il segnaposto
    virtual void delRefFrom( const ExaTabRef& ref, int& err );
    virtual void delRefFrom( const ExaTabRef& ref );

    // Serve a forzare il funzionamento per la serializzazione
    virtual PKeyItem& operator[]( unsigned int i );

    enum errNb { ERR_NONE = 1, ERR_GENERIC = 0, ERR_KEY_NOT_UNIQUE = -1};

    // numero totale dei riferimenti FROM alla tabella di
    // riferimento con quella chiave
    int nbRefFrom( const PKeyItem& ref_to ) const;

    // numero totale dei riferimenti FROM
    int nbRefFrom( void ) const;
protected:
    // Forza la creazione dei riferimenti indipendentemente dalle liste
    void appendRefFrom (const vector<PKeyItem> &vec);

    // override of [PReport]
    virtual void reportMake( const string& objname = "" ) const;

private:
    vector < PKeyItem > m_ref_vector; // mappatura di ref e di chiave tipo FROM

    // conta il numero totale di riferimenti alla tabella ref_tab
    unsigned int m_count( const int& ref_tab ) const;

    // restituisce gli indici con le posizioni dei riferimenti a ref_tab
    list <unsigned int> m_findPos( const int& ref_tab ) const;

    void m_appendRefFrom( const PKeyItem& key);
    void m_appendRefFrom( const PKeyList* plist);

    static string m_objname;
};

Q_DECLARE_METATYPE(PRef) // SERIALIZZAZIONE

#endif // PREF_H

